

package cc.stonemarket.caricature.util;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;
  
public abstract class XmlParentUtil<T> {
	
	//子类要重写下面三个方法
	abstract protected T startTag(XmlPullParser pullParser,T object) throws Exception;
	abstract protected List<T> endTag(XmlPullParser pullParser,T object,List<T> result);
	abstract protected void writeToFile(XmlSerializer writer,List<T> objects) throws Exception;
    
    public List<T> readXmlFile(InputStream inputStream) throws Exception {
    	//创建pull解析对象
    	XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();
    	XmlPullParser pullParser = pullParserFactory.newPullParser();
    	pullParser.setInput(inputStream, "UTF-8");		//this.getClass().getClassLoader().getResourceAsStream("books.xml");
        
        T obj = null;   
        List<T> result = null;
        int type = pullParser.getEventType();   		// 得到当前解析的位置
        while (type != XmlPullParser.END_DOCUMENT) {	// 当没有解析的文档的末尾的时候，一直执行   
            switch (type){
               case XmlPullParser.START_DOCUMENT:
            	 result = new ArrayList<T>();			// 开始解析文档的时候，初始化对象集合   
                 break;
              case XmlPullParser.START_TAG:
            	 obj=startTag(pullParser,obj);			// 开始解析标签的时候，根据标签的不同名称。做不同操作   
                 break;
              case XmlPullParser.END_TAG:				// 当解析到标签结束的时候执行  
            	result=endTag(pullParser,obj,result);
                break;
            }
            type = pullParser.next();   				// 当前解析位置结束，指向下一个位置 
        }
        
        inputStream.close();
        return result;   // 返回对象数组 
    }
    
    //传入一个输出流writer 如生成到内存中: StringWriter writer = new StringWriter(); 
    //也可以生成到文件中，那就需要定义一个文件输出流。
    public void writeToXmlFile(Writer outputStream, List<T> objects) throws Exception {   
        
        XmlSerializer writer = Xml.newSerializer(); // 创建一个xml连接对象   
        writer.setOutput(outputStream);				// 将需要输出的输出流放到xml连接对象里
        
        writer.startDocument("UTF-8", true);	//开始创建文档  
        writeToFile(writer,objects);
        writer.endDocument();					//结束文档
        
        outputStream.flush();			// 刷新输出量的缓冲区
        outputStream.close();			// 关闭输出流 
        //return output.toString();		// 以字符创形式返回输出流中的数据 
    }
    
    
    
    
}  








